package com.witframework.web.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.util.WebUtils;

import com.witframework.core.BaseEntity;
import com.witframework.core.message.MessageCacheManager;
import com.witframework.core.message.UIMessage;
import com.witframework.core.persistence.PageSortModel;
import com.witframework.util.BeanUtils;
/**
 * Spring MVC controller的辅助类
 * 注意此类只能用于spring mvc
 * @author wuxinyang
 *
 */
public class ControllerHelper {
	private HttpServletRequest request=null;

	public ControllerHelper(HttpServletRequest request){
		if(request==null)
			throw new RequestInvalidException("HttpServletRequest is Invalid.ERROR!!!");
		this.request=request;

	}
	/**
	 * 数据列表页面的统一标识字段名称，该名称的值取实体的唯一标识值
	 */
	public String[] getSelItemList(){
		if(request!=null)
			return request.getParameterValues("itemlist");
		return new String[]{"_NONE_*_"};
	}
	/**
	 * 返回查询过滤器
	 * @return Map<String,String>
	 */
	public Map<String,Object> getFilter(){
		if(request!=null)
			return WebUtils.getParametersStartingWith(request,"_");
		return new HashMap<String,Object>();
	}

	/**
	 * 是否新增实体,请注意唯一标识的字段名称为"ID"
	 */
	public boolean isNew(BaseEntity entity){
		if(entity==null)
			return true;
		try {
			String id= (String) BeanUtils.getDeclaredProperty(entity,"id");
			if(null!=id&&id.length()>0){
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return true;
	}
	public boolean isNew(BaseEntity entity,String idname){
		if(entity==null)
			return true;
		try {
			String id= (String) BeanUtils.getDeclaredProperty(entity,idname);
			if(null!=id&&id.length()>0){
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return true;
	}
	/**
	 *构造分页模型
	 *@param table_id -ec table的tableId,如果该值为null则取默认的名称"ec"
	 *			该值必须和页面的ec table的id设置值一致。
	 */
	public PageSortModel getPageSortModel(String table_id){
		if(table_id==null){
			table_id=(String)request.getParameter("ec_i");
		}
		return new PageSortModel(request,table_id);
	}
	/**
	 * 返回分页模型对象
	 * @return -分页模型对象
	 */
	public PageSortModel getPageSortModel(){
		String table_id=(String)request.getParameter("ec_i");
		if(table_id==null) table_id="ec";
		return new PageSortModel(request,table_id);
	}
	/**
	 * 设置WEB页面消息
	 * @param message 消息内容
	 * @param type 消息类型：可以为
	 *  ActionMessage.ERROR：错误消息
	 *  ActionMessage.INFO:提示消息
	 *  ActionMessage.WARNING:警告类型消息
	 */
	public void setActionMessage(String message,int type){
		cacheMessage(message,type);
		if(request!=null){
			List<String> messages = (List<String>) WebUtils.getOrCreateSessionAttribute(request.getSession(), "actionMessages", ArrayList.class);
			messages.add(message);
		}
	}
	/**
	 * 添加错误信息
	 * @param message
	 * @deprecated {@link #setActionMessage(String, int)}
	 *
	 */
	public void addActionError(String message) {
		cacheMessage(message,UIMessage.ERROR);
		if(request!=null){
			List<String> errorMessages = (List<String>) WebUtils.getOrCreateSessionAttribute(request.getSession(), "actionMessages", ArrayList.class);
			errorMessages.add(message);
		}
	}
	/**
	 * 添加处理信息
	 * @param message
	 * @deprecated
	 */
	public  void addActionMessage(String message) {
		cacheMessage(message,UIMessage.INFO);
		if(request!=null){
			List<String> messages = (List<String>) WebUtils.getOrCreateSessionAttribute(request.getSession(), "actionMessages", ArrayList.class);
			messages.add(message);
		}
	}
	/**
	 * 添加处理信息
	 * @param message
	 * @deprecated
	 */
	public  void addWarningMessage(String message) {
		cacheMessage(message,UIMessage.WARNING);
		if(request!=null){
			List<String> messages = (List<String>) WebUtils.getOrCreateSessionAttribute(request.getSession(), "actionMessages", ArrayList.class);
			messages.add(message);
		}
	}
	/**
	 * 添加javascript弹出信息
	 * @param popMessage
	 * @deprecated
	 */
	public void addPopMessage(String popMessage) {
		cacheMessage(popMessage,UIMessage.INFO);
		if(request!=null){
			List<String> popMessages = (List<String>) WebUtils.getOrCreateSessionAttribute(request.getSession(), "actionMessages", ArrayList.class);
			popMessages.add(popMessage);
		}
	}
	/**
	 * 添加校验错误信息
	 * @param fieldName -字段名称
	 * @param message -消息或国际化消息的key值
	 * @param param -消息的参数
	 * @param defaultMessage -缺省的消息内容
	 */
	public void addFieldError(String fieldName,String message,Object[] param,String defaultMessage){
		org.springframework.context.support.ResourceBundleMessageSource ms=(org.springframework.context.support.ResourceBundleMessageSource)com.witframework.core.BeanFactory.getBean("messageSource");

		if(request!=null){
			String msg=ms.getMessage(message, param,message, request.getLocale());
			if(msg==null) msg=defaultMessage;
			List<String> messages = (List<String>) WebUtils.getOrCreateSessionAttribute(request.getSession(), "fieldErrors", ArrayList.class);
			messages.add(msg);
		}
	}
	/**
	 * 获取资源消息串，用于本地化，查询一个特定语言环境的资源
	 * @param code 代码
	 * @param param 参数，用于替换资源串中的变量
	 * @return 本地化资源串
	 */
	public String getMessage(String code,Object[] param){
		org.springframework.context.support.ResourceBundleMessageSource ms=(org.springframework.context.support.ResourceBundleMessageSource)com.witframework.core.BeanFactory.getBean("messageSource");
		if(request!=null){
			String msg=ms.getMessage(code, param,code, request.getLocale());
			return msg;
		}
		return code;
	}
	/**
	 * 获取资源消息串，用于本地化，查询一个特定语言环境的资源
	 * @param code 代码
	 * @return 本地化资源串
	 * @see #getMessage(String, Object[])
	 */
	public String getMessage(String code){
		return getMessage(code,null);
	}
	private void cacheMessage(String msg,int msgType){
		UIMessage message=new UIMessage(msg,msgType);
		if(message.getId()!=null){
		MessageCacheManager.getInstance().store(message);
		String messagerequestids=(String)WebUtils.getSessionAttribute(request, "messagerequestids");
		if(messagerequestids!=null&&messagerequestids.length()>0)
			messagerequestids=messagerequestids+","+message.getId();
		else{
			messagerequestids=message.getId();
		}
		WebUtils.setSessionAttribute(request,"messagerequestids", messagerequestids);
		}
	}
}
